/**
 * {作业名称}
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, Records }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");

    // 处理逻辑
    A.db.trans('MP', conn => {
      // 验证所有出库单,确保未记账
      const { Rows: postedRecords } = A.job.CardR(UID, 'ST.出库单', ['出库日期'], [['ID', 'in', Records.map(r => r.ID)], ['出库日期', 'is', !null]]);
      if (postedRecords.length > 0) throw Error("不能使用已记账的出库单");

      // 加载出库单明细
      const { Rows } = A.job.CardR(UID, 'ST.出库单明细', ['出库单', '出库单.仓库', '品规', '品规.商品.类型', '数量'],
        [['品规.商品.类型', 'in', [0, 1]], ['出库单', 'in', Records.map(r => r.ID)]]);

      // 验证是否同一个仓库
      const repo = Rows[0]['出库单.仓库'];
      if (Rows.some(r => r['出库单.仓库'] !== repo)) throw Error("请选择相同仓库的出库单");

      // 生成组装单
      const bill = {
        ID: A.guid(),
        仓库: repo,
      };
      // 生成组装单明细
      const details = Rows.map(r => ({
        组装单: bill.ID,
        品规: r.品规,
        数量: r.数量,
      }));

      A.job.CardW(UID, 'ST.组装单', null, bill);
      A.job.CardW(UID, 'ST.组装单明细', null, details);
    });

    // 返回结果
    return true;
  };
})()